<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>dubbo面试 | 雁过留声</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="源码分析https:&#x2F;&#x2F;www.jianshu.com&#x2F;p&#x2F;0dc2b6a0b270  2.dubbo是什么一个基于java的高性能的rpc分布式服务框架  为什么要用dubbo随着用户增多，单机负载逐渐增多，这是需要业务拆分，满足性能要求，业务直接通过远程调用  Dubbo 和 Spring Cloud 有什么区别？通信方式不同，dubbo基于rpc ，spring cloud基于http r">
<meta property="og:type" content="article">
<meta property="og:title" content="dubbo面试">
<meta property="og:url" content="http://yanglf007.gitee.io/blog/2020/08/10/dubbo%E9%9D%A2%E8%AF%95/index.html">
<meta property="og:site_name" content="雁过留声">
<meta property="og:description" content="源码分析https:&#x2F;&#x2F;www.jianshu.com&#x2F;p&#x2F;0dc2b6a0b270  2.dubbo是什么一个基于java的高性能的rpc分布式服务框架  为什么要用dubbo随着用户增多，单机负载逐渐增多，这是需要业务拆分，满足性能要求，业务直接通过远程调用  Dubbo 和 Spring Cloud 有什么区别？通信方式不同，dubbo基于rpc ，spring cloud基于http r">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2020-08-09T17:49:13.724Z">
<meta property="article:modified_time" content="2020-09-24T16:41:06.442Z">
<meta property="article:author" content="yanglf007">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/blog/atom.xml" title="雁过留声" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/blog/css/style.css">

<meta name="generator" content="Hexo 4.2.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/blog/" id="logo">雁过留声</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/blog/">Home</a>
        
          <a class="main-nav-link" href="/blog/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/blog/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yanglf007.gitee.io/blog"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-dubbo面试" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/blog/2020/08/10/dubbo%E9%9D%A2%E8%AF%95/" class="article-date">
  <time datetime="2020-08-09T17:49:13.724Z" itemprop="datePublished">2020-08-10</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      dubbo面试
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <ol>
<li>源码分析<br><a href="https://www.jianshu.com/p/0dc2b6a0b270" target="_blank" rel="noopener">https://www.jianshu.com/p/0dc2b6a0b270</a></li>
</ol>
<p>2.dubbo是什么<br>一个基于java的高性能的rpc分布式服务框架</p>
<ol start="3">
<li><p>为什么要用dubbo<br>随着用户增多，单机负载逐渐增多，这是需要业务拆分，满足性能要求，业务直接通过远程调用</p>
</li>
<li><p>Dubbo 和 Spring Cloud 有什么区别？<br>通信方式不同，dubbo基于rpc ，spring cloud基于http restful<br>注册中心      zookeeper      spring cloud eureka<br>spring cloud 组件完善，<br>断路器 netflix Hystrix<br>网关   gateway<br>分布式配置中心 springcloud-config<br>消息总线       springcloud-bus</p>
</li>
<li><p>dubbo 内置了哪几种服务容器<br>spring container<br>jetty container<br>log4j container</p>
</li>
<li><p>Dubbo里面有哪几种节点角色<br>provider<br>customer<br>register  服务主从与发现<br>monitor   统计服务调用次数<br>container 服务运行容器   </p>
</li>
<li><p>负载均衡策略<br>RandomLoadBalance 随机（默认）<br>RoundRobinLoadBalance 轮训<br>ConsistentHashLoadBalance 一致性hash负载<br>LeastActiveLoadBalance 最不活跃</p>
</li>
<li><p>dubbo 核心配置<br>dubbo:protocol<br>dubbo:register<br>dubbo:reference<br>dubbo:application<br>dubbo:service<br>dubbo:monitor<br>dubbo:method<br>dubbo:argument</p>
</li>
<li><p>在 Provider 上可以配置的 Consumer 端的属性有哪些？</p>
</li>
</ol>
<p>1）timeout：方法调用超时<br>2）retries：失败重试次数，默认重试 2 次<br>3）loadbalance：负载均衡算法，默认随机<br>4）actives 消费者端，最大并发调用限制</p>
<p>10 Dubbo推荐使用什么序列化框架，你知道的还有哪些？</p>
<p>推荐使用Hessian序列化，还有Duddo、FastJson、Java自带序列化</p>
<ol start="11">
<li><p>Dubbo默认使用的是什么通信框架，还有别的选择吗？<br>Dubbo 默认使用 Netty 框架</p>
</li>
<li><p>Dubbo有哪几种集群容错方案，默认是哪种？</p>
</li>
</ol>
<p>Failover Cluster，失败自动切换，当出现失败，重试其它服务器。通常用于读操作，但重试会带来更长延迟。<br>Failfast Cluster，快速失败，只发起一次调用，失败立即报错。通常用于非幂等性的写操作，比如新增记录。<br>Failsafe Cluster，失败安全，出现异常时，直接忽略。通常用于写入日志等。<br>Failback Cluster，失败自动恢复，后台记录失败请求，定时重发。通常用于消息通知等。<br>Forking Cluster，并行调用多个服务器，只要一个成功即返回。通常用于实时性要求较高的读操作，但需要浪费更多服务资源。可通过 forks 来设置最大并行数。<br>Broadcast Cluster，广播调用所有提供者，逐个调用，任意一台报错则报错。通常用于通知所有提供者更新缓存本地资源信息。<br>默认 Failover Cluster</p>
<ol start="13">
<li>点对点测试功能<br>配置 dubbo reference 中的url<br>&lt;dubbo:reference id=”xxxService” interface=”com.alibaba.xxx.XxxService” url=”dubbo://localhost:20890” /&gt;</li>
</ol>
<p>然后在映射文件中添加配置xxx.properties，其中key是服务名称，value是服务提供者URL：<br>com.alibaba.xxx.XxxService=dubbo://localhost:20890</p>
<ol start="14">
<li><p>dubbo 接口有多个实现时的配置方案<br>当一个接口有多种实现时，可以用 group 属性来分组，服务提供方和消费方都指定同一个 group 即可。</p>
</li>
<li><p>服务上线怎么兼容旧版本？<br>通过配置版本号 version </p>
</li>
<li><p>如何异步调用</p>
</li>
</ol>
<p>客户端配置</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dubbo:reference</span> <span class="attr">id</span>=<span class="string">"demoService"</span> <span class="attr">check</span>=<span class="string">"false"</span> <span class="attr">interface</span>=<span class="string">"com.yanglf.springmybatislearn.dubbo.service.DemoService"</span>  &gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dubbo:method</span> <span class="attr">name</span>=<span class="string">"sayHello"</span> <span class="attr">async</span>=<span class="string">"true"</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dubbo:reference</span>&gt;</span></span><br></pre></td></tr></table></figure>
<p>代码中使用</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Future&lt;String&gt; future = RpcContext.getContext().getFuture();</span><br></pre></td></tr></table></figure>

<ol start="17">
<li>Dubbo的管理控制台能做什么？<br>管理控制台主要包含：路由规则，动态配置，服务降级，访问控制，权重调整，负载均衡，等管理功能。</li>
</ol>
<ol start="18">
<li>dubbo 服务暴露过程</li>
</ol>
<p>com.alibaba.dubbo.config.spring.ServiceBean 实现了ApplicationListener<br>监听ContextRefreshedEvent 事件<br>调用export（）方法，接着调用 doExport（），该方法实现异步发布<br>经过Exchange(com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchanger.bind),<br>Transporter(com.alibaba.dubbo.remoting.Transporters#bind(com.alibaba.dubbo.common.URL, com.alibaba.dubbo.remoting.ChannelHandler…)),<br>最后交个netty</p>
<ol start="19">
<li><p>dubbo spi机制<br>通过接口名称和key值,能获取到接口的具体实现,并且注入到容器中进行管理<br>比如的Protocol和LoadBalance 都是spi机制加载的,默认实现dubbo协议和随机负载均衡,通过 ExtensionLoader加载<br>配置文件在<br>　　META-INF/services/<br>　　META-INF/dubbo/<br>　　META-INF/dubbo/internal/</p>
</li>
<li><p>dubbo和hesion协议有什么不通</p>
</li>
</ol>
<p>dubbo协议 单一长链接,基于nio的异步通信,适合数据量少,消费者比服务者多,不适合传输数据文件<br>http协议  多个短链接,同步,有协议头,数据包混合<br>hessian协议 多个短连接,同步,基于http协议,可以传文件,适合服务提供者多与消费者</p>
<ol start="21">
<li><p>kafka与rocketmq对比<br>数据可靠性<br>kafka只支持异步刷盘<br>rocketmq 可以同步刷盘,也可以异步刷盘,可靠性更高<br>性能<br>kafka单机支持100w tps ,主要原因是productor 可以将多个小消息合并发送到broker<br>rocketmq 单机十几万tps, 不支持消息合并发送<br>队列数<br>kafka 单机队列数64,队列数越多,负载越高<br>rocketmq 单机支持5w队列,负载没什么变化,支持队列越多,可以创建的topic就越多<br>消息投递实时性<br>kafka是短轮询,延时取决于轮询时间<br>rocketmq是长轮询,会有几ms的延时<br>失败重试<br>kafka不支持失败重试<br>rocketmq可以失败重试,重试默认16次,重试间隔时间依次增加<br>顺序消费<br>kafka支持顺序消费<br>rocketmq,资产同一个broker的顺序消费,想要全局的顺序性<br>定时消息<br>kafka不支持定时消息<br>rocketmq支持定时消息<br>消息查询<br>kafka 不支持消息查询<br>rocketmq 支持messageId 和 message key查询<br>消息过滤<br>kafka不支持消息过滤<br>rocketmq支持消费短根据tag进行消息过滤,相当于2级topic</p>
</li>
<li><p>消息堆积怎么处理</p>
</li>
<li><p>rocketmq消息重试机制是什么原理</p>
</li>
</ol>
<p>rpc主要考虑哪些问题<br> 1,透明化调用<br> 2,远程通信协议<br> 3,注册中心,服务发现与注册<br> 4,远程通信<br> 5,序列化反序列化<br> 6,长链接还是短链接<br> 7,负载均衡<br> 8,结果缓存<br> 9,多版本控制<br> 10,异步调用<br> 11,优雅停机<br> 12,集成spring</p>
<p>dubbo如何试下并发控制</p>
<p>ExecuteLimitFilter,通过信号量Semaphore,如果信号量不存在,则创建一个,tryAcquire()获取不到就报错</p>
<p>如何做到限流<br>TpsLimitFilter<br>原理是滑动窗口</p>
<p>dubbo 服务暴露过程<br>ServiceBean 监听ApplicationEvent事件<br>调用export方法 是 serviceConfig的方法<br>里面会有调用 doExportUrls<br>根据配置文件，组装一个url,根据本地暴露还是远程暴露，组装不同的url</p>
<p>无注册中心：dubbo://192.168.3.19:20880/xxxx<br>有注册中心：registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=provider&amp;dubbo=2.0.2&amp;export=dubbo://192.168.3.19:20880/xxxx</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yanglf007.gitee.io/blog/2020/08/10/dubbo%E9%9D%A2%E8%AF%95/" data-id="ckgtnonlx0003m8ul80zwadr0" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/blog/2020/08/10/1%E4%BB%8A%E6%97%A5%E5%B7%A5%E4%BD%9C/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          1今日工作
        
      </div>
    </a>
  
  
    <a href="/blog/2020/08/09/mybatis%E9%9D%A2%E8%AF%95/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">mybatis面试</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/10/">October 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/08/">August 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/07/">July 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/06/">June 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/05/">May 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/04/">April 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/blog/2020/10/25/%E6%AF%8F%E6%97%A5%E5%AD%A6%E4%B9%A0/">每日学习</a>
          </li>
        
          <li>
            <a href="/blog/2020/10/12/mybatis-plus/">mybatis-plus</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/30/%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F/">秒杀系统</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/29/elasticsearch%E7%9F%A5%E8%AF%86/">elasticsearch知识</a>
          </li>
        
          <li>
            <a href="/blog/2020/08/28/redis%E9%9D%A2%E8%AF%95/">redis面试</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2020 yanglf007<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/blog/" class="mobile-nav-link">Home</a>
  
    <a href="/blog/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  
<link rel="stylesheet" href="/blog/fancybox/jquery.fancybox.css">

  
<script src="/blog/fancybox/jquery.fancybox.pack.js"></script>




<script src="/blog/js/script.js"></script>




  </div>
</body>
</html>